#include <iostream>

/*
 * 类模板中成员函数是调用时创建的，导致分文件编写时连接不到
 *      1、直接包含 *.cpp 文件
 *      2、将声明和实现写到一个文件中，后缀名改为.hpp，包含在头文件即可
 */
//#include "person.h"  # 报错
//#include "person.cpp"

#include "person.hpp"

using namespace std;

/*
 * 类模板与继承
 *      1、当子类继承的父类是一个类模板时，子类在声明的时候，要指定出父类中T的类型
 *      2、如果不指定，编译器无法给子类分配内存
 *      3、如果想灵活指定出父类中T的类型，子类也需变为类模板
 */

template<typename T>
class Base{
    T m;
};

//class Son: public Base{};  // 未指定类型，不能继承
class Son: public Base<int>{};

template<typename T1, typename T2>
class Son2: public Base<T2>{
public:
    T1 t;
    Son2(){
        cout << "T1类型：" << typeid(T1).name() << endl;
        cout << "T2类型：" << typeid(T2).name() << endl;
    }
};

template<typename T1, typename T2>
class Person{
    Person();

    void func1();
};

template<class T1, class T2>
Person<T1, T2>::Person() {}  // 类模板构造函数的类外实现

template<class T1, class T2>
void Person<T1, T2>::func1() {}   // 类模板成员函数的类外实现

void test01(){
    Son2<string, int> s();   // 函数类型？？？
    cout << "s类型：" << typeid(s).name() << endl;
    Son2<string, int>s2;
}

void test02(){
    Person2<string, int>p;
}

int main() {
    test01();
    test02();
    return 0;
}
